{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Trino \n",
    "\n",
    "This tutorial will show you how to get a Trino (f.k.a PrestoSQL) instance up and running locally to test JupySQL. You can run this in a Jupyter notebook."
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Pre-requisites\n",
    "\n",
    "To run this tutorial, you need to install following Python packages:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Note: you may need to restart the kernel to use updated packages.\n"
     ]
    }
   ],
   "source": [
    "%pip install jupysql trino pandas pyarrow --quiet"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You also need a Trino connector. Here is the [supported connector](https://pypi.org/project/sqlalchemy-trino/). You can install it with:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Note: you may need to restart the kernel to use updated packages.\n"
     ]
    }
   ],
   "source": [
    "%pip install sqlalchemy-trino --quiet"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Start Trino instance\n",
    "\n",
    "We fetch the official image, create a new database, and user (this will take a few seconds)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "cba8365556d3f35dd56cfd06747276ef1c7b7661eb4268b74e665d8d4d44a7e7\n"
     ]
    }
   ],
   "source": [
    "%%bash\n",
    "docker run -p 8080:8080 --name trino -d trinodb/trino"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Our database is running, let's load some data!"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load sample data\n",
    "\n",
    "Now, let's fetch some sample data. We'll be using the [NYC taxi dataset](https://www.nyc.gov/site/tlc/about/tlc-trip-record-data.page):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1369769, 19)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "\n",
    "df = pd.read_parquet(\n",
    "    \"https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2021-01.parquet\"\n",
    ")\n",
    "df.shape"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Trino has maximum query text length of 1000000. Therefore, writing the whole NYC taxi dataset (~1.4M rows) will throw errors. A workaround is to increase the [`http-server.max-request-size`](https://trino.io/docs/current/admin/properties-query-management.html#query-max-length) configuration parameter to Trino's maximum allowed characters of 1,000,000,000 in the Trino server configuration file (config.properties). We'll write a subset of the data instead:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = df.head(1000)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Trino uses a schema named \"default\" to store tables. Therefore, `schema='default'` is required in the connection string."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "from sqlalchemy import create_engine\n",
    "\n",
    "engine = create_engine(\n",
    "    \"trino://user@localhost:8080/memory\", connect_args={\"user\": \"user\"}\n",
    ")\n",
    "\n",
    "df.to_sql(\n",
    "    con=engine,\n",
    "    name=\"taxi\",\n",
    "    schema=\"default\",\n",
    "    method=\"multi\",\n",
    "    index=False,\n",
    ")\n",
    "\n",
    "engine.dispose()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Query\n",
    "\n",
    "Now, let's start JupySQL, authenticate, and query the data!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "Tip: You may define configurations in /Users/neelashasen/Dev/jupysql_master/jupysql/pyproject.toml. Please review our <a href='https://jupysql.ploomber.io/en/latest/api/configuration.html#loading-from-a-file'>configuration guideline</a>."
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Connecting to &#x27;default&#x27;</span>"
      ],
      "text/plain": [
       "Connecting to 'default'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%load_ext sql"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Connecting and switching to connection &#x27;trino://user@localhost:8080/memory&#x27;</span>"
      ],
      "text/plain": [
       "Connecting and switching to connection 'trino://user@localhost:8080/memory'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%sql trino://user@localhost:8080/memory"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```{important}\n",
    "If the cell above fails, you might have some missing packages. Message us on [Slack](https://ploomber.io/community) and we'll help you!\n",
    "```"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "List the tables in the database:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table>\n",
       "    <thead>\n",
       "        <tr>\n",
       "            <th>Name</th>\n",
       "        </tr>\n",
       "    </thead>\n",
       "    <tbody>\n",
       "        <tr>\n",
       "            <td>taxi</td>\n",
       "        </tr>\n",
       "    </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "+------+\n",
       "| Name |\n",
       "+------+\n",
       "| taxi |\n",
       "+------+"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%sqlcmd tables --schema default"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "List columns in the taxi table:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table>\n",
       "    <thead>\n",
       "        <tr>\n",
       "            <th>name</th>\n",
       "            <th>type</th>\n",
       "            <th>nullable</th>\n",
       "            <th>default</th>\n",
       "        </tr>\n",
       "    </thead>\n",
       "    <tbody>\n",
       "        <tr>\n",
       "            <td>vendorid</td>\n",
       "            <td>BIGINT</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>tpep_pickup_datetime</td>\n",
       "            <td>TIMESTAMP</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>tpep_dropoff_datetime</td>\n",
       "            <td>TIMESTAMP</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>passenger_count</td>\n",
       "            <td>DOUBLE</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>trip_distance</td>\n",
       "            <td>DOUBLE</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>ratecodeid</td>\n",
       "            <td>DOUBLE</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>store_and_fwd_flag</td>\n",
       "            <td>VARCHAR</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>pulocationid</td>\n",
       "            <td>BIGINT</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>dolocationid</td>\n",
       "            <td>BIGINT</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>payment_type</td>\n",
       "            <td>BIGINT</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>fare_amount</td>\n",
       "            <td>DOUBLE</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>extra</td>\n",
       "            <td>DOUBLE</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>mta_tax</td>\n",
       "            <td>DOUBLE</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>tip_amount</td>\n",
       "            <td>DOUBLE</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>tolls_amount</td>\n",
       "            <td>DOUBLE</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>improvement_surcharge</td>\n",
       "            <td>DOUBLE</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>total_amount</td>\n",
       "            <td>DOUBLE</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>congestion_surcharge</td>\n",
       "            <td>DOUBLE</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>airport_fee</td>\n",
       "            <td>DOUBLE</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "    </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "+-----------------------+-----------+----------+---------+\n",
       "|          name         |    type   | nullable | default |\n",
       "+-----------------------+-----------+----------+---------+\n",
       "|        vendorid       |   BIGINT  |   True   |   None  |\n",
       "|  tpep_pickup_datetime | TIMESTAMP |   True   |   None  |\n",
       "| tpep_dropoff_datetime | TIMESTAMP |   True   |   None  |\n",
       "|    passenger_count    |   DOUBLE  |   True   |   None  |\n",
       "|     trip_distance     |   DOUBLE  |   True   |   None  |\n",
       "|       ratecodeid      |   DOUBLE  |   True   |   None  |\n",
       "|   store_and_fwd_flag  |  VARCHAR  |   True   |   None  |\n",
       "|      pulocationid     |   BIGINT  |   True   |   None  |\n",
       "|      dolocationid     |   BIGINT  |   True   |   None  |\n",
       "|      payment_type     |   BIGINT  |   True   |   None  |\n",
       "|      fare_amount      |   DOUBLE  |   True   |   None  |\n",
       "|         extra         |   DOUBLE  |   True   |   None  |\n",
       "|        mta_tax        |   DOUBLE  |   True   |   None  |\n",
       "|       tip_amount      |   DOUBLE  |   True   |   None  |\n",
       "|      tolls_amount     |   DOUBLE  |   True   |   None  |\n",
       "| improvement_surcharge |   DOUBLE  |   True   |   None  |\n",
       "|      total_amount     |   DOUBLE  |   True   |   None  |\n",
       "|  congestion_surcharge |   DOUBLE  |   True   |   None  |\n",
       "|      airport_fee      |   DOUBLE  |   True   |   None  |\n",
       "+-----------------------+-----------+----------+---------+"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%sqlcmd columns --table taxi --schema default"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Query our data:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Running query in &#x27;trino://user@localhost:8080/memory&#x27;</span>"
      ],
      "text/plain": [
       "Running query in 'trino://user@localhost:8080/memory'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<table>\n",
       "    <thead>\n",
       "        <tr>\n",
       "            <th>_col0</th>\n",
       "        </tr>\n",
       "    </thead>\n",
       "    <tbody>\n",
       "        <tr>\n",
       "            <td>1000</td>\n",
       "        </tr>\n",
       "    </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "+-------+\n",
       "| _col0 |\n",
       "+-------+\n",
       "|  1000 |\n",
       "+-------+"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%sql\n",
    "SELECT COUNT(*) FROM default.taxi"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Parameterize queries"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "threshold = 10"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Running query in &#x27;trino://user@localhost:8080/memory&#x27;</span>"
      ],
      "text/plain": [
       "Running query in 'trino://user@localhost:8080/memory'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<table>\n",
       "    <thead>\n",
       "        <tr>\n",
       "            <th>_col0</th>\n",
       "        </tr>\n",
       "    </thead>\n",
       "    <tbody>\n",
       "        <tr>\n",
       "            <td>949</td>\n",
       "        </tr>\n",
       "    </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "+-------+\n",
       "| _col0 |\n",
       "+-------+\n",
       "|  949  |\n",
       "+-------+"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%sql\n",
    "SELECT COUNT(*) FROM default.taxi\n",
    "WHERE trip_distance < {{threshold}}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "threshold = 0.5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Running query in &#x27;trino://user@localhost:8080/memory&#x27;</span>"
      ],
      "text/plain": [
       "Running query in 'trino://user@localhost:8080/memory'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<table>\n",
       "    <thead>\n",
       "        <tr>\n",
       "            <th>_col0</th>\n",
       "        </tr>\n",
       "    </thead>\n",
       "    <tbody>\n",
       "        <tr>\n",
       "            <td>64</td>\n",
       "        </tr>\n",
       "    </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "+-------+\n",
       "| _col0 |\n",
       "+-------+\n",
       "|   64  |\n",
       "+-------+"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%sql\n",
    "SELECT COUNT(*) FROM default.taxi\n",
    "WHERE trip_distance < {{threshold}}"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## CTEs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Running query in &#x27;trino://user@localhost:8080/memory&#x27;</span>"
      ],
      "text/plain": [
       "Running query in 'trino://user@localhost:8080/memory'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Skipping execution...</span>"
      ],
      "text/plain": [
       "Skipping execution..."
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%%sql --save many_passengers --no-execute\n",
    "SELECT *\n",
    "FROM default.taxi\n",
    "WHERE passenger_count > 3\n",
    "-- remove top 1% outliers for better visualization\n",
    "AND trip_distance < 18.93"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Running query in &#x27;trino://user@localhost:8080/memory&#x27;</span>"
      ],
      "text/plain": [
       "Running query in 'trino://user@localhost:8080/memory'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<table>\n",
       "    <thead>\n",
       "        <tr>\n",
       "            <th>_col0</th>\n",
       "            <th>_col1</th>\n",
       "            <th>_col2</th>\n",
       "        </tr>\n",
       "    </thead>\n",
       "    <tbody>\n",
       "        <tr>\n",
       "            <td>0.25</td>\n",
       "            <td>3.16470588235294</td>\n",
       "            <td>11.15</td>\n",
       "        </tr>\n",
       "    </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "+-------+------------------+-------+\n",
       "| _col0 |      _col1       | _col2 |\n",
       "+-------+------------------+-------+\n",
       "|  0.25 | 3.16470588235294 | 11.15 |\n",
       "+-------+------------------+-------+"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%sql --save trip_stats --with many_passengers\n",
    "SELECT MIN(trip_distance), AVG(trip_distance), MAX(trip_distance)\n",
    "FROM many_passengers"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This is what JupySQL executes:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WITH many_passengers AS (\n",
      "SELECT *\n",
      "FROM default.taxi\n",
      "WHERE passenger_count > 3\n",
      "\n",
      "AND trip_distance < 18.93)\n",
      "SELECT MIN(trip_distance), AVG(trip_distance), MAX(trip_distance)\n",
      "FROM many_passengers\n"
     ]
    }
   ],
   "source": [
    "query = %sqlcmd snippets trip_stats\n",
    "print(query)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plotting"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The %sqlplot magic command currently does not directly support the `--schema` option for specifying the schema name. To work around this, you can specify the schema in the SQL query itself."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Running query in &#x27;trino://user@localhost:8080/memory&#x27;</span>"
      ],
      "text/plain": [
       "Running query in 'trino://user@localhost:8080/memory'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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6dMdbdOnTzckGXfccUe59f3+++/l2t59911DkrFhw4Zyyxg3bpyj7fTp00aLFi0Mi8ViJCQkONp/++03o379+k77pCI7d+40JBn//Oc/ndonT55sSDLWrFnjaIuOjjYaNmx43uVVpGvXrsZ1113n1CbJ8PDwMHbv3l1u/Ln23S233OI07r777jMkGd99991513+hunfs2GFIMiZMmOBou+6665xqHjx4cLlj7mzPPvusIck4fPhwub6KfscRERFG27Ztndpat25d7veelZVlWK1WY9KkSY62adOmGZKMDz/8sNxyS0tLDcMwjDfffNPw8PAwvvrqK6f+hQsXGpKMjRs3nnd7gIvFZSzABS+99JISExPLvbp3737Bz/r5+Wn37t06cODARa/3iy++UJ06dfTAAw84tU+aNEmGYWjFihWS5Ljsct999zmNu//++8+57HvvvbdcW/369R0/FxQU6Pjx4+rdu7ck6dtvvy03/p///Kfj5zp16qhnz54yDENjx451tPv5+alTp0768ccfz1mLdGZbJWnixIlO7ZMmTZIkff755+f9/KW47rrrFBISUunxZ58BKdvPZdvgKm9vb0nSyZMnzznGz89PR48e1TfffOPSOv74Oy47Y3ndddfpxx9/VE5OjtPYkJAQXXvttY73TZs2Lfe7/N///qcePXro1ltvLbeusjOBy5YtU5cuXdS5c2cdP37c8brxxhslSWvXrnVpW4Bz4TIW4IJrrrlGPXv2LNfeqFGjCi9v/dGsWbM0ePBgdezYUVdeeaUGDBigUaNGVSoo/fzzz2revLl8fHyc2rt06eLoL/tfDw8PtWnTxmlc+/btz7nss8dK0okTJzRz5kwtXbpUWVlZTn1n/yGUpFatWjm99/X1Vb169RyXTv7Yfva8n7OVbcPZNQcFBcnPz8+xrdWhon1xPh06dHB6365dO3l4eDjmxbgqLy9Pksr9vv9o6tSpWr16ta655hq1b99e/fv315133qk+ffpUah0bN27U9OnTlZycrN9//92pLycnR76+vo73Z/9+pTPH/G+//eZ4f+jQIUVFRZ13nQcOHNDevXsdl9LOdvaxBlwqwg5Qw/r166dDhw7pk08+0apVq/Tf//5Xc+fO1cKFC53OjNS0P/4Lv8ztt9+uTZs2acqUKbrqqqvk7e2t0tJSDRgwoMJnwNSpU6dSbZLKTag+l5p87k2ZivbFxaiqmn/44QdJ5w+pXbp0UUpKipYvX66VK1fqf//7n15++WVNmzZNM2fOPO/yDx06pLCwMHXu3Flz5sxRy5Yt5eXlpS+++EJz584t9zu+1N9lmdLSUnXr1k1z5sypsL9ly5YXtTzgQgg7gBv4+/trzJgxGjNmjPLy8tSvXz/NmDHDEXbO9ceydevWWr16tU6ePOn0r/19+/Y5+sv+t7S0VIcPH3Y663Dw4MFK1/jbb78pKSlJM2fO1LRp0xztrlx+c0XZNhw4cMBx5kqSMjMzlZ2d7djW2uDAgQNOZ4MOHjyo0tLSC05svpA333xTFotFN91003nHNWzYUMOHD9fw4cNVVFSkoUOH6qmnnlJcXJzq1at3zuPps88+U2FhoT799FOnszaXchmpXbt2jpB2vjHfffedwsLC3BJm8efDnB2ghp19+cbb21vt27d3uuW27Bk3Zz/xdtCgQSopKdGLL77o1D537lxZLBYNHDhQkhQRESFJevnll53GvfDCC5Wus+xf8Wf/q33evHmVXsalGDRoUIXrKzsbcL47y2pa2aMCypTt57LfhysSEhK0atUqDR8+vNxlsj86+3jy8vJSSEiIDMNw3B14ruOpot9xTk6OFi1a5HLdUVFR+u677xx3y/1R2Xpuv/12/fLLL3r11VfLjTl16pTy8/NdXj9QEc7sADUsJCRE119/vUJDQ+Xv769t27bpgw8+UGxsrGNMaGioJOmBBx5QRESE6tSpoxEjRujmm2/WDTfcoEcffVQ//fSTevTooVWrVumTTz7RQw89pHbt2jk+HxUVpXnz5unXX3913Hpe9ryWyvxr2mazqV+/fpo9e7aKi4t1xRVXaNWqVTp8+HA17JXyevTooejoaL3yyivKzs7Wddddp61bt2rJkiUaMmSIbrjhhhqpozIOHz6sW265RQMGDFBycrLeeust3XnnnerRo8cFP3v69Gm99dZbks5MAv/555/16aefateuXbrhhhv0yiuvnPfz/fv3V1BQkPr06aPAwEDt3btXL774oiIjIx1n/8qOp0cffVQjRoyQp6enbr75ZvXv319eXl66+eab9a9//Ut5eXl69dVXFRAQoPT0dJf2xZQpU/TBBx/otttu0913363Q0FCdOHFCn376qRYuXKgePXpo1KhRev/993Xvvfdq7dq16tOnj0pKSrRv3z69//77+vLLLyucEwe4zH03ggGXn7Jbz7/55psK+6+77roL3nr+5JNPGtdcc43h5+dn1K9f3+jcubPx1FNPGUVFRY4xp0+fNu6//36jadOmhsVicboN/eTJk8aECROM5s2bG56enkaHDh2MZ5991nFbb5n8/HwjJibG8Pf3N7y9vY0hQ4YYKSkphiSnW8HLbp8+duxYue05evSoceuttxp+fn6Gr6+vcdtttxlpaWnnvAX77GWc69bqivZTRYqLi42ZM2cabdq0MTw9PY2WLVsacXFxRkFBQaXWcyHnuvU8JiamwvHn2u49e/YYw4YNM3x8fIxGjRoZsbGxxqlTpy64/ujoaKfHFjRo0MAIDg42oqKijA8++MAoKSkp95mzbz3/z3/+Y/Tr189o3LixYbVajXbt2hlTpkwxcnJynD73xBNPGFdccYXh4eHhdBv6p59+anTv3t2oV6+eERwcbDzzzDPG66+/Xu5W9datW1f4yISz6zEMw/j111+N2NhY44orrjC8vLyMFi1aGNHR0cbx48cdY4qKioxnnnnG6Nq1q2G1Wo1GjRoZoaGhxsyZM8vVDlwqi2Fc5MwyAJetnTt36i9/+YveeustjRw50t3lXPZmzJihmTNn6tixY+XuOANQezBnBzCpU6dOlWubN2+ePDw8LvjkYgAwE+bsACY1e/Zsbd++XTfccIPq1q2rFStWaMWKFRo3bhy39gL4UyHsACb1t7/9TYmJiXriiSeUl5enVq1aacaMGXr00UfdXRoA1Cjm7AAAAFNjzg4AADA1wg4AADA15uzozPe0pKWlycfHh0eXAwBwmTAMQydPnlTz5s3l4XHu8zeEHUlpaWncnQIAwGXqyJEjatGixTn7CTuS45HqR44ckc1mc3M1AACgMnJzc9WyZUunL0auCGFH/+97gmw2G2EHAIDLzIWmoDBBGQAAmBphBwAAmJpbw05wcLAsFku5V0xMjCSpoKBAMTExaty4sby9vRUVFaXMzEynZaSmpioyMlINGjRQQECApkyZotOnT7tjcwAAQC3k1rDzzTffKD093fFKTEyUJN12222SpAkTJuizzz7TsmXLtH79eqWlpWno0KGOz5eUlCgyMlJFRUXatGmTlixZosWLF2vatGlu2R4AAFD71Kqvi3jooYe0fPlyHThwQLm5uWratKneeecdDRs2TJK0b98+denSRcnJyerdu7dWrFihv//970pLS1NgYKAkaeHChZo6daqOHTsmLy+vSq03NzdXvr6+ysnJYYIyAACXicr+/a41c3aKior01ltv6e6775bFYtH27dtVXFys8PBwx5jOnTurVatWSk5OliQlJyerW7dujqAjSREREcrNzdXu3bvPua7CwkLl5uY6vQAAgDnVmrDz8ccfKzs7W6NHj5YkZWRkyMvLS35+fk7jAgMDlZGR4Rjzx6BT1l/Wdy7x8fHy9fV1vHigIAAA5lVrws5rr72mgQMHqnnz5tW+rri4OOXk5DheR44cqfZ1AgAA96gVDxX8+eeftXr1an344YeOtqCgIBUVFSk7O9vp7E5mZqaCgoIcY7Zu3eq0rLK7tcrGVMRqtcpqtVbhFgAAgNqqVpzZWbRokQICAhQZGeloCw0Nlaenp5KSkhxtKSkpSk1Nld1ulyTZ7XZ9//33ysrKcoxJTEyUzWZTSEhIzW0AAACotdx+Zqe0tFSLFi1SdHS06tb9f+X4+vpq7Nixmjhxovz9/WWz2XT//ffLbrerd+/ekqT+/fsrJCREo0aN0uzZs5WRkaHHHntMMTExnLkBAACSakHYWb16tVJTU3X33XeX65s7d648PDwUFRWlwsJCRURE6OWXX3b016lTR8uXL9f48eNlt9vVsGFDRUdHa9asWTW5CQAAoBarVc/ZcReeswMAwOXnsnvODgAAQHUg7AAAAFNz+5wdswt+5HN3l3DRfkqIvPAgAAAuE5zZAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApub2sPPLL7/oH//4hxo3bqz69eurW7du2rZtm6PfMAxNmzZNzZo1U/369RUeHq4DBw44LePEiRMaOXKkbDab/Pz8NHbsWOXl5dX0pgAAgFrIrWHnt99+U58+feTp6akVK1Zoz549eu6559SoUSPHmNmzZ2v+/PlauHChtmzZooYNGyoiIkIFBQWOMSNHjtTu3buVmJio5cuXa8OGDRo3bpw7NgkAANQyFsMwDHet/JFHHtHGjRv11VdfVdhvGIaaN2+uSZMmafLkyZKknJwcBQYGavHixRoxYoT27t2rkJAQffPNN+rZs6ckaeXKlRo0aJCOHj2q5s2bX7CO3Nxc+fr6KicnRzabreo2UFLwI59X6fJqwk8Jke4uAQCAC6rs32+3ntn59NNP1bNnT912220KCAjQX/7yF7366quO/sOHDysjI0Ph4eGONl9fX/Xq1UvJycmSpOTkZPn5+TmCjiSFh4fLw8NDW7ZsqXC9hYWFys3NdXoBAABzcmvY+fHHH7VgwQJ16NBBX375pcaPH68HHnhAS5YskSRlZGRIkgIDA50+FxgY6OjLyMhQQECAU3/dunXl7+/vGHO2+Ph4+fr6Ol4tW7as6k0DAAC1hFvDTmlpqa6++mo9/fTT+stf/qJx48bpnnvu0cKFC6t1vXFxccrJyXG8jhw5Uq3rAwAA7uPWsNOsWTOFhIQ4tXXp0kWpqamSpKCgIElSZmam05jMzExHX1BQkLKyspz6T58+rRMnTjjGnM1qtcpmszm9AACAObk17PTp00cpKSlObfv371fr1q0lSW3atFFQUJCSkpIc/bm5udqyZYvsdrskyW63Kzs7W9u3b3eMWbNmjUpLS9WrV68a2AoAAFCb1XXnyidMmKC//e1vevrpp3X77bdr69ateuWVV/TKK69IkiwWix566CE9+eST6tChg9q0aaPHH39czZs315AhQySdORM0YMAAx+Wv4uJixcbGasSIEZW6EwsAAJibW8POX//6V3300UeKi4vTrFmz1KZNG82bN08jR450jHn44YeVn5+vcePGKTs7W3379tXKlStVr149x5i3335bsbGxCgsLk4eHh6KiojR//nx3bBIAAKhl3PqcndqC5+w44zk7AIDLwWXxnB0AAIDqRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgBAACmRtgB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okUuF+QOPGfHGc/ZAQBcDqrlOTuXW4gBAAC4pAnKAAAAtR1hBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmJpbw058fLz++te/ysfHRwEBARoyZIhSUlKcxhQUFCgmJkaNGzeWt7e3oqKilJmZ6TQmNTVVkZGRatCggQICAjRlyhSdPn26JjcFAADUUm4NO+vXr1dMTIw2b96sxMREFRcXq3///srPz3eMmTBhgj777DMtW7ZM69evV1pamoYOHeroLykpUWRkpIqKirRp0yYtWbJEixcv1rRp09yxSQAAoJaxGIZhuLuIMseOHVNAQIDWr1+vfv36KScnR02bNtU777yjYcOGSZL27dunLl26KDk5Wb1799aKFSv097//XWlpaQoMDJQkLVy4UFOnTtWxY8fk5eV1wfXm5ubK19dXOTk5stlsVbpNwY98XqXLqwk/JUS6uwQAAC6osn+/a9WcnZycHEmSv7+/JGn79u0qLi5WeHi4Y0znzp3VqlUrJScnS5KSk5PVrVs3R9CRpIiICOXm5mr37t0VrqewsFC5ublOLwAAYE513V1AmdLSUj300EPq06ePrrzySklSRkaGvLy85Ofn5zQ2MDBQGRkZjjF/DDpl/WV9FYmPj9fMmTOreAvMg7NRAAAzqTVndmJiYvTDDz9o6dKl1b6uuLg45eTkOF5Hjhyp9nUCAAD3qBVndmJjY7V8+XJt2LBBLVq0cLQHBQWpqKhI2dnZTmd3MjMzFRQU5BizdetWp+WV3a1VNuZsVqtVVqu1ircCAADURm49s2MYhmJjY/XRRx9pzZo1atOmjVN/aGioPD09lZSU5GhLSUlRamqq7Ha7JMlut+v7779XVlaWY0xiYqJsNptCQkJqZkMAAECt5dYzOzExMXrnnXf0ySefyMfHxzHHxtfXV/Xr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Y/jw4cbBgwfdXVaNWbt2rSGp3Cs6OtowjDO3nz/++ONGYGCgYbVajbCwMCMlJcW9RVej8+2P33//3ejfv7/RtGlTw9PT02jdurVxzz33mPYfCRXtB0nGokWLHGNOnTpl3HfffUajRo2MBg0aGLfeequRnp7uvqKr0YX2R2pqqtGvXz/D39/fsFqtRvv27Y0pU6YYOTk57i28mtx9991G69atDS8vL6Np06ZGWFiYI+gYxp/r2LhUFsMwjJo7jwQAAFCzmLMDAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADoNrNmDFDV111VY2tb/To0RoyZEiNrQ9A7cZDBQFcFIvFct7+6dOna8aMGU5teXl5KiwsVOPGjV1e77p163TDDTc4avDx8VHbtm110003acKECU7fjZSTkyPDMOTn53fB5Y4ePVrZ2dn6+OOPXa4NQO1W190FALi8pKenO35+7733NG3aNKWkpDjavL29HT8bhqGSkhJ5e3s7tV+KlJQU2Ww25ebm6ttvv9Xs2bP12muvad26derWrZskydfXt0rWBcAcuIwF4KIEBQU5Xr6+vrJYLI73+/btk4+Pj1asWKHQ0FBZrVZ9/fXX5S5jlV1mmjlzppo2bSqbzaZ7771XRUVFF1x/QECAgoKC1LFjR40YMUIbN25U06ZNNX78+HLLL/PBBx+oW7duql+/vho3bqzw8HDl5+drxowZWrJkiT755BNZLBZZLBatW7dOkjR16lR17NhRDRo0UNu2bfX444+ruLjYscyybXrzzTcVHBwsX19fjRgxQidPnnSMKS0t1ezZs9W+fXtZrVa1atVKTz31lKP/yJEjuv322+Xn5yd/f38NHjxYP/3008X/UgCcF2EHQJV75JFHlJCQoL1796p79+4VjklKStLevXu1bt06vfvuu/rwww81c+bMi15X/fr1de+992rjxo3Kysoq15+enq477rhDd999t2N9Q4cOlWEYmjx5sm6//XYNGDBA6enpSk9P19/+9jdJko+PjxYvXqw9e/bo+eef16uvvqq5c+c6LfvQoUP6+OOPtXz5ci1fvlzr169XQkKCoz8uLk4JCQl6/PHHtWfPHr3zzjsKDAyUJBUXFysiIkI+Pj766quvtHHjRnl7e2vAgAGVCn0AKo/LWACq3KxZs3TTTTedd4yXl5def/11NWjQQF27dtWsWbM0ZcoUPfHEE/LwuLh/h3Xu3FmS9NNPPykgIMCpLz09XadPn9bQoUPVunVrSXJc7pLOhKXCwkIFBQU5fe6xxx5z/BwcHKzJkydr6dKlevjhhx3tpaWlWrx4sXx8fCRJo0aNUlJSkp566imdPHlSzz//vF588UVFR0dLktq1a6e+fftKOnMJsLS0VP/9738d86AWLVokPz8/rVu3Tv3797+ofQDg3Ag7AKpcz549LzimR48eatCggeO93W5XXl6ejhw54ggllVV2n0VFk6d79OihsLAwdevWTREREerfv7+GDRumRo0anXeZ7733nubPn69Dhw4pLy9Pp0+fls1mcxoTHBzsCDqS1KxZM8fZpb1796qwsFBhYWEVLv+7777TwYMHnT4vSQUFBTp06NCFNxpApXEZC0CVa9iwYY2ub+/evZLOhI+z1alTR4mJiVqxYoVCQkL0wgsvqFOnTjp8+PA5l5ecnKyRI0dq0KBBWr58uXbs2KFHH3203OUlT09Pp/cWi0WlpaWSzpwxOp+8vDyFhoZq586dTq/9+/frzjvvrMxmA6gkwg4At/juu+906tQpx/vNmzfL29tbLVu2vKjlnDp1Sq+88or69eunpk2bVjjGYrGoT58+mjlzpnbs2CEvLy999NFHks5cTispKXEav2nTJrVu3VqPPvqoevbsqQ4dOujnn3++qLo6dOig+vXrKykpqcL+q6++WgcOHFBAQIDat2/v9OJuMqBqEXYAuEVRUZHGjh2rPXv26IsvvtD06dMVGxt7wfk6WVlZysjI0IEDB7R06VL16dNHx48f14IFCyocv2XLFj399NPatm2bUlNT9eGHH+rYsWPq0qWLpDNng3bt2qWUlBQdP35cxcXF6tChg1JTU7V06VIdOnRI8+fPd4SjyqpXr56mTp2qhx9+WG+88YYOHTqkzZs367XXXpMkjRw5Uk2aNNHgwYP11Vdf6fDhw1q3bp0eeOABHT169KLWBeD8mLMDwC3CwsLUoUMH9evXT4WFhbrjjjvKPYywIp06dZLFYpG3t7fatm2r/v37a+LEieUmGJex2WzasGGD5s2bp9zcXLVu3VrPPfecBg4cKEm65557tG7dOvXs2VN5eXlau3atbrnlFk2YMEGxsbEqLCxUZGSkHn/88UrV90ePP/646tatq2nTpiktLU3NmjXTvffeK0lq0KCBNmzYoKlTp2ro0KE6efKkrrjiCoWFhZWbGwTg0vAEZQA1jqcWA6hJXMYCAACmRtgBAACmxmUsAABgapzZAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApkbYAQAApvb/AQi3lQkmdslEAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "result = %sql SELECT trip_distance FROM default.taxi\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "data = result.DataFrame()\n",
    "\n",
    "plt.hist(data[\"trip_distance\"])\n",
    "plt.xlabel(\"Trip Distance\")\n",
    "plt.ylabel(\"Frequency\")\n",
    "plt.title(\"Histogram of Trip Distance\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Running query in &#x27;trino://user@localhost:8080/memory&#x27;</span>"
      ],
      "text/plain": [
       "Running query in 'trino://user@localhost:8080/memory'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjIAAAHHCAYAAACle7JuAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABD/UlEQVR4nO3de3yMZ/7/8fckkUgkGaecKBJCaQXf0iJEBYuUbiNUW+yi2q1+2W7Rg+gB3ZZWq7Tdrh52V3r4oltV22pRZ1HRXVQ1dYpUHCpxauUsInP//vDLvUZCg8jknryej8c8du77vuaeT5Ktec91X9d92QzDMAQAAGBBHq4uAAAA4GoRZAAAgGURZAAAgGURZAAAgGURZAAAgGURZAAAgGURZAAAgGURZAAAgGURZAAAgGURZAA3Z7PZNG3aNFeX4eQ///mPoqOjVadOHdlsNu3YsaPS32PUqFEKDw+v9PNeiaSkJNlsNmVkZLi0DsCdEWSAq1T6IXXhIzg4WLGxsVq+fLmry7tmu3bt0rRp0yr9Q7i4uFh33323fv75Z82ZM0cffPCBmjVrVqZdeHh4md9veY+kpKRKre9S1q9f7/S+Pj4+CgkJUc+ePTVjxgydOHGiUt6noKBA06ZN0/r16yvlfIC783J1AYDVPffcc4qIiJBhGDp27JiSkpJ0xx136PPPP9fAgQNdXd5V27Vrl6ZPn66ePXtWas9Genq6Dh48qHfffVcPPPDAJdvNnTtXeXl55vaXX36phQsXas6cOWrYsKG5Pzo6utzXv/vuu3I4HJVWd6lHHnlEt956q0pKSnTixAlt3rxZU6dO1auvvqp//vOf6tWrl9n2d7/7ne699175+PhU+PwFBQWaPn26JKlnz56VXT7gdggywDWKi4tTp06dzO0xY8YoJCRECxcutHSQuV6OHz8uSapbt+5l28XHxzttZ2VlaeHChYqPj79ssMrPz1edOnVUq1ata6y0fDExMRoyZIjTvu+++059+/bV4MGDtWvXLoWFhUmSPD095enpeV3qAHAel5aASla3bl35+vrKy8v5e0J+fr4mTZqkJk2ayMfHRzfeeKNeeeUVlS5AX1hYqNatW6t169YqLCw0X/fzzz8rLCxM0dHRKikpkXR+/Ie/v79+/PFH9evXT3Xq1FGjRo303HPPqSIL2n/77beKi4tTYGCg/P391bt3b23ZssU8npSUpLvvvluSFBsba15O+bXLHWvXrlVMTIzq1KmjunXr6q677tLu3bvN46NGjdLtt98uSbr77rtls9muqdeh9PeQnp6uO+64QwEBARo+fLh57MLAk5GRIZvNpldeeUVz5sxRs2bN5Ovrq9tvv12pqalXXYMktW/fXnPnztXp06f1l7/8xdxf3hiZrVu3ql+/fmrYsKF8fX0VERGh+++/36wxKChIkjR9+nTz9146xmnnzp0aNWqUmjdvrtq1ays0NFT333+/Tp065VTPtGnTZLPZtH//fo0aNUp169aV3W7X6NGjVVBQUKb+Dz/8ULfddpv8/PxUr1499ejRQ1999ZVTm+XLl5t/24CAAA0YMEA//PDDNf3egMpAjwxwjbKzs3Xy5EkZhqHjx4/rjTfeUF5enkaMGGG2MQxDv/3tb7Vu3TqNGTNGHTp00MqVK/X444/rp59+0pw5c+Tr66v33ntP3bp101NPPaVXX31VkjRu3DhlZ2crKSnJ6dt9SUmJ+vfvry5dumjWrFlasWKFpk6dqnPnzum55567ZL0//PCDYmJiFBgYqCeeeEK1atXS22+/rZ49e2rDhg3q3LmzevTooUceeUSvv/66pkyZojZt2kiS+b/lWb16teLi4tS8eXNNmzZNhYWFeuONN9StWzdt375d4eHheuihh9S4cWPNmDHDvEQTEhJyTb//c+fOqV+/furevbteeeUV+fn5Xbb9+++/r9zcXI0bN05nzpzRa6+9pl69eun777+/plqGDBmiMWPG6KuvvtILL7xQbpvjx4+rb9++CgoK0uTJk1W3bl1lZGRoyZIlkqSgoCDNmzdPDz/8sAYNGqSEhARJUrt27SRJq1at0o8//qjRo0crNDRUP/zwg9555x398MMP2rJli2w2m9P7DR06VBEREZo5c6a2b9+uv/3tbwoODtZLL71ktpk+fbqmTZum6OhoPffcc/L29tY333yjtWvXqm/fvpKkDz74QCNHjlS/fv300ksvqaCgQPPmzVP37t317bffunxQNWo4A8BVmT9/viGpzMPHx8dISkpyart06VJDkvH888877R8yZIhhs9mM/fv3m/sSExMNDw8PY+PGjcbHH39sSDLmzp3r9LqRI0cakow//vGP5j6Hw2EMGDDA8Pb2Nk6cOGHul2RMnTrV3I6Pjze8vb2N9PR0c9/Ro0eNgIAAo0ePHua+0vdet25dhX4fHTp0MIKDg41Tp06Z+7777jvDw8PD+P3vf2/uW7dunSHJ+Pjjjyt03lIvv/yyIck4cOCAua/09zB58uQy7UeOHGk0a9bM3D5w4IAhyfD19TWOHDli7v/mm28MScaECRMu+/4Vqbt9+/ZGvXr1zO3S/4+U1vzpp58akoz//Oc/lzzHiRMnyvzNShUUFJTZt3DhQkOSsXHjRnPf1KlTDUnG/fff79R20KBBRoMGDczttLQ0w8PDwxg0aJBRUlLi1NbhcBiGYRi5ublG3bp1jQcffNDpeFZWlmG328vsB6oal5aAa/Tmm29q1apVWrVqlT788EPFxsbqgQceML9lS+cHqnp6euqRRx5xeu2kSZNkGIbTLKdp06bp5ptv1siRI/W///u/uv3228u8rtT48ePN5zabTePHj9fZs2e1evXqctuXlJToq6++Unx8vJo3b27uDwsL07Bhw7Rp0ybl5ORc8e8gMzNTO3bs0KhRo1S/fn1zf7t27fSb3/xGX3755RWf80o8/PDDFW4bHx+vxo0bm9u33XabOnfuXCk1+vv7Kzc395LHS8cFLVu2TMXFxVd8fl9fX/P5mTNndPLkSXXp0kWStH379jLtx44d67QdExOjU6dOmX/jpUuXyuFw6Nlnn5WHh/PHQWnvzqpVq3T69Gndd999OnnypPnw9PRU586dtW7duiv+OYDKRJABrtFtt92mPn36qE+fPho+fLi++OIL3XTTTWaokKSDBw+qUaNGCggIcHpt6aWagwcPmvu8vb31j3/8QwcOHFBubq7mz59f5pKBJHl4eDiFEUlq1aqVJF1yyvSJEydUUFCgG2+8scyxNm3ayOFw6PDhwxX/4f+/0vovdd6TJ08qPz//is9bEV5eXrrhhhsq3L5ly5Zl9rVq1apSppnn5eWV+Rtf6Pbbb9fgwYM1ffp0NWzYUHfddZfmz5+voqKiCp3/559/1p/+9CeFhITI19dXQUFBioiIkHT+EufFmjZt6rRdr149SdIvv/wi6fwMMg8PD910002XfM+0tDRJUq9evRQUFOT0+Oqrr8zB24CrMEYGqGQeHh6KjY3Va6+9prS0NN18881XfI6VK1dKOv+tOy0tzfywQlk+Pj5lehNcobi4WPv27VPbtm0v2cZms2nx4sXasmWLPv/8c61cuVL333+/Zs+erS1btsjf3/+y7zF06FBt3rxZjz/+uDp06CB/f385HA7179+/3Knml5oxZVRgQHip0vN+8MEHCg0NLXP84kHtQFXj/4HAdXDu3DlJMu+D0qxZM61evVq5ublO39j37NljHi+1c+dOPffccxo9erR27NihBx54QN9//73sdrvTezgcDv34449mL4wk7du3T5IuOfgyKChIfn5+2rt3b5lje/bskYeHh5o0aSJJ5fYCXUpp/Zc6b8OGDVWnTp0Kn+96Ku1huNC+ffuuecDq4sWLVVhYqH79+v1q2y5duqhLly564YUXtGDBAg0fPlyLFi3SAw88cMnf+y+//KI1a9Zo+vTpevbZZ8395f08FdWiRQs5HA7t2rVLHTp0uGQbSQoODlafPn2u+r2A68X1X2MAN1NcXKyvvvpK3t7e5qWjO+64QyUlJU5TcyVpzpw5stlsiouLM187atQoNWrUSK+99pqSkpJ07NgxTZgwodz3uvB8hmHoL3/5i2rVqqXevXuX297T01N9+/bVv/71L6dLKceOHdOCBQvUvXt3BQYGSpIZPE6fPv2rP3NYWJg6dOig9957z6l9amqqvvrqK91xxx2/eo6qsnTpUv3000/m9r///W9988035t/ganz33Xd69NFHVa9ePY0bN+6S7X755ZcyvSGlAaL08lLprKuLf++lvSsXv37u3LlXXXd8fLw8PDz03HPPlenRKX2ffv36KTAwUDNmzCh3XE9l3dEYuFr0yADXaPny5WbPyvHjx7VgwQKlpaVp8uTJZii48847FRsbq6eeekoZGRlq3769vvrqK/3rX//So48+an7rff7557Vjxw6tWbNGAQEBateunZ599lk9/fTTGjJkiFMgqF27tlasWKGRI0eqc+fOWr58ub744gtNmTLFvBdJeZ5//nmtWrVK3bt31//+7//Ky8tLb7/9toqKijRr1iyzXYcOHeTp6amXXnpJ2dnZ8vHxUa9evRQcHFzueV9++WXFxcWpa9euGjNmjDn92m63V6u1niIjI9W9e3c9/PDDKioq0ty5c9WgQQM98cQTFXp9cnKyzpw5o5KSEp06dUpff/21PvvsM9ntdn366aflXn4p9d577+mvf/2rBg0apBYtWig3N1fvvvuuAgMDzb+tr6+vbrrpJn300Udq1aqV6tevr7Zt26pt27bq0aOHZs2apeLi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kqS4uDgNGDBAvr6+Kiws1BdffKHly5eXaQfAvRFkAFSpgoIC7dmz56pe++OPP5rPV65caQYX6fwikhe22759+1W9R+vWreXn53dVrwVQ9QgyAKrUnj171LFjx2s+z8W9Lhdu7969+6rfY9u2bbrllluuqTYAVYcgA6BKtW7dWtu2bbuq13744YeaM2eOJKlevXpq2bKl/v3vf+u2225TWlqafvnlF0nShAkTNGLEiKuuD4B12Aw3HxWXk5Mju92u7OxsBQYGurocANfg7Nmz8vX1lcPhkM1mcxrUW7rt4eGhwsJCeXt7u7BSANeqop/fzFoCYBne3t6aNGnSZdtMmjSJEAPUIFxaAmAps2bNkiTNmTNH586dM/d7enpqwoQJ5nEANQM9MgAsZ9asWcrPz9fEiRMlSRMnTlR+fj4hBqiBCDIALMnb21vDhw+XJA0fPpzLSUANRZABAACWRZABAACWRZABAACWRZABAACWRZABAACWRZABAACWRZABAACWRZABAACWRZABAACWRZABAACWRZABAACWRZABAACWRZABAACWRZABAACWRZABAACWRZABAACWRZABAACWRZABAACWRZABAACWVa2DzLRp02Sz2ZwerVu3dnVZAACgmvBydQG/5uabb9bq1avNbS+val8yAACoItU+FXh5eSk0NNTVZQAAgGqoWl9akqS0tDQ1atRIzZs31/Dhw3Xo0KHLti8qKlJOTo7TAwAAuKdqHWQ6d+6spKQkrVixQvPmzdOBAwcUExOj3NzcS75m5syZstvt5qNJkyZVWDEAAKhKNsMwDFcXUVGnT59Ws2bN9Oqrr2rMmDHltikqKlJRUZG5nZOToyZNmig7O1uBgYFVVSqAKrB9+3Z17NhR27Zt0y233OLqcgBUopycHNnt9l/9/K72Y2QuVLduXbVq1Ur79++/ZBsfHx/5+PhUYVUAAMBVqvWlpYvl5eUpPT1dYWFhri4FAABUA9U6yDz22GPasGGDMjIytHnzZg0aNEienp667777XF0aAACoBqr1paUjR47ovvvu06lTpxQUFKTu3btry5YtCgoKcnVpAACgGqjWQWbRokWuLgEAAFRj1frSEgAAwOUQZAAAgGURZAAAgGURZAAAgGVV68G+AKqXtLS0yy4RUtV2797t9L/VRUBAgFq2bOnqMoAagSADoELS0tLUqlUrV5dRrhEjRri6hDL27dtHmAGqAEEGQIWU9sR8+OGHatOmjYurOa+wsFAZGRkKDw+Xr6+vq8uRdL53aMSIEdWq5wpwZwQZAFekTZs21WqBxm7durm6BAAuxGBfAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWV6uLgCANdjOndH/hHrI9/Q+6SjfgS7F9/Q+/U+oh2znzri6FKBGIMgAqJDaeYe0/SF/aeND0kZXV1N9tZG0/SF/7c47JCna1eUAbo8gA6BCzvg31S1v5+n//u//1KZ1a1eXU23t3rNHw4cP19/vaOrqUoAagSADoEIMr9r6NsuhwrqtpEYdXF1OtVWY5dC3WQ4ZXrVdXQpQI3ChGwAAWBZBBgAAWBZBBgAAWBZBBgAAWBZBBgAAWBZBBgAAWBbTrwFUSEFBgSRp+/btLq7kvwoLC5WRkaHw8HD5+vq6uhxJ0u7du11dAlCjEGQAVMiePXskSQ8++KCLK7GGgIAAV5cA1AgEGQAVEh8fL0lq3bq1/Pz8XFvM/7d7926NGDFCH374odq0aePqckwBAQFq2bKlq8sAagSCDIAKadiwoR544AFXl1GuNm3a6JZbbnF1GQBcgMG+AADAsggyAADAsggyAADAsggyAADAsiwRZN58802Fh4erdu3a6ty5s/7973+7uiQAAFANVPsg89FHH2nixImaOnWqtm/frvbt26tfv346fvy4q0sDAAAuVu2DzKuvvqoHH3xQo0eP1k033aS33npLfn5++sc//uHq0gAAgItV6/vInD17Vtu2bVNiYqK5z8PDQ3369FFKSkq5rykqKlJRUZG5nZOTc93rBFBxBQUF5l2Cr1XpcgCVuSxAdbrhH4BfV62DzMmTJ1VSUqKQkBCn/SEhIZf8h3DmzJmaPn16VZQH4Crs2bNHHTt2rNRzjhgxotLOtW3bNm6uB1hItQ4yVyMxMVETJ040t3NyctSkSRMXVgTgQq1bt9a2bdsq5VzXY9HI1q1bV8p5AFSNah1kGjZsKE9PTx07dsxp/7FjxxQaGlrua3x8fOTj41MV5QG4Cn5+fpXa49GtW7dKOxcA66nWg329vb3VsWNHrVmzxtzncDi0Zs0ade3a1YWVAQCA6qBa98hI0sSJEzVy5Eh16tRJt912m+bOnav8/HyNHj3a1aUBAAAXq/ZB5p577tGJEyf07LPPKisrSx06dNCKFSvKDAAGAAA1j80wDMPVRVxPOTk5stvtys7OVmBgoKvLAQAAFVDRz+9qPUYGAADgcggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsggyAADAsqr9EgXXqvTGxTk5OS6uBAAAVFTp5/avLUDg9kEmNzdXktSkSRMXVwIAAK5Ubm6u7Hb7JY+7/VpLDodDR48eVUBAgGw2m6vLAVCJcnJy1KRJEx0+fJi11AA3YxiGcnNz1ahRI3l4XHokjNsHGQDui0VhATDYFwAAWBZBBgAAWBZBBoBl+fj4aOrUqfLx8XF1KQBchDEyAADAsuiRAQAAlkWQAQAAlkWQAQAAlkWQAQAAlkWQAWA5Gzdu1J133qlGjRrJZrNp6dKlri4JgIsQZABYTn5+vtq3b68333zT1aUAcDG3XzQSgPuJi4tTXFycq8sAUA3QIwMAACyLIAMAACyLIAMAACyLIAMAACyLIAMAACyLWUsALCcvL0/79+83tw8cOKAdO3aofv36atq0qQsrA1DVWP0agOWsX79esbGxZfaPHDlSSUlJVV8QAJchyAAAAMtijAwAALAsggwAALAsggwAALAsggwAALAsggwAALAsggwAALAsggwAALAsggyAazJt2jR16NChyt5v1KhRio+Pr7L3A1C9cUM8ACabzXbZ41OnTtW0adOc9uXl5amoqEgNGjS46ve98E69NptNAQEBat68uX7zm99owoQJCgsLM9tmZ2fLMAzVrVv3V887atQonT59WkuXLr3q2gBUb6y1BMCUmZlpPv/oo4/07LPPau/eveY+f39/87lhGCopKZG/v7/T/muxd+9eBQYGKicnR9u3b9esWbP097//XevXr1dUVJQkyW63V8p7AXAPXFoCYAoNDTUfdrtdNpvN3N6zZ48CAgK0fPlydezYUT4+Ptq0aVOZS0ull36mT5+uoKAgBQYGauzYsTp79uyvvn9wcLBCQ0PVqlUr3Xvvvfr6668VFBSkhx9+uMz5Sy1evFhRUVHy9fVVgwYN1KdPH+Xn52vatGl677339K9//Us2m002m03r16+XJD355JNq1aqV/Pz81Lx5cz3zzDMqLi42z1n6M33wwQcKDw+X3W7Xvffeq9zcXLONw+HQrFmzFBkZKR8fHzVt2lQvvPCCefzw4cMaOnSo6tatq/r16+uuu+5SRkbGlf9RAFwWQQbAFZk8ebJefPFF7d69W+3atSu3zZo1a7R7926tX79eCxcu1JIlSzR9+vQrfi9fX1+NHTtWX3/9tY4fP17meGZmpu677z7df//95vslJCTIMAw99thjGjp0qPr376/MzExlZmYqOjpakhQQEKCkpCTt2rVLr732mt59913NmTPH6dzp6elaunSpli1bpmXLlmnDhg168cUXzeOJiYl68cUX9cwzz2jXrl1asGCBQkJCJEnFxcXq16+fAgIClJycrK+//lr+/v7q379/hQIdgIrj0hKAK/Lcc8/pN7/5zWXbeHt76x//+If8/Px0880367nnntPjjz+uP//5z/LwuLLvT61bt5YkZWRkKDg42OlYZmamzp07p4SEBDVr1kySzEtQ0vkgVFRUpNDQUKfXPf300+bz8PBwPfbYY1q0aJGeeOIJc7/D4VBSUpICAgIkSb/73e+0Zs0avfDCC8rNzdVrr72mv/zlLxo5cqQkqUWLFurevbuk85flHA6H/va3v5njjubPn6+6detq/fr16tu37xX9DgBcGkEGwBXp1KnTr7Zp3769/Pz8zO2uXbsqLy9Phw8fNgNHRZXORyhvIHL79u3Vu3dvRUVFqV+/furbt6+GDBmievXqXfacH330kV5//XWlp6crLy9P586dU2BgoFOb8PBwM8RIUlhYmNkrtHv3bhUVFal3797lnv+7777T/v37nV4vSWfOnFF6evqv/9AAKoxLSwCuSJ06dar0/Xbv3i3pfLC4mKenp1atWqXly5frpptu0htvvKEbb7xRBw4cuOT5UlJSNHz4cN1xxx1atmyZvv32Wz311FNlLvnUqlXLadtms8nhcEg639NzOXl5eerYsaN27Njh9Ni3b5+GDRtWkR8bQAURZABUuu+++06FhYXm9pYtW+Tv768mTZpc0XkKCwv1zjvvqEePHgoKCiq3jc1mU7du3TR9+nR9++238vb21qeffirp/CWukpISp/abN29Ws2bN9NRTT6lTp05q2bKlDh48eEV1tWzZUr6+vlqzZk25x2+55RalpaUpODhYkZGRTg9mXQGViyADoNKdPXtWY8aM0a5du/Tll19q6tSpGj9+/K+Ojzl+/LiysrKUlpamRYsWqVu3bjp58qTmzZtXbvtvvvlGM2bM0NatW3Xo0CEtWbJEJ06cUJs2bSSd78XZuXOn9u7dq5MnT6q4uFgtW7bUoUOHtGjRIqWnp+v11183g09F1a5dW08++aSeeOIJvf/++0pPT9eWLVv097//XZI0fPhwNWzYUHfddZeSk5N14MABrV+/Xo888oiOHDlyRe8F4PIYIwOg0vXu3VstW7ZUjx49VFRUpPvuu6/MjfTKc+ONN8pms8nf31/NmzdX3759NXHixDKDdUsFBgZq48aNmjt3rnJyctSsWTPNnj1bcXFxkqQHH3xQ69evV6dOnZSXl6d169bpt7/9rSZMmKDx48erqKhIAwYM0DPPPFOh+i70zDPPyMvLS88++6yOHj2qsLAwjR07VpLk5+enjRs36sknn1RCQoJyc3PVuHFj9e7du8xYHADXhjv7AqhU3E0XQFXi0hIAALAsggwAALAsLi0BAADLokcGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABY1v8DD4XjW69zCxAAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "result = %sql SELECT trip_distance FROM default.taxi\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "data = result.DataFrame()\n",
    "\n",
    "plt.boxplot(data[\"trip_distance\"])\n",
    "plt.xlabel(\"Trip Distance\")\n",
    "plt.ylabel(\"Value\")\n",
    "plt.title(\"Boxplot of Trip Distance\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Persist"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Running query in &#x27;trino://user@localhost:8080/memory&#x27;</span>"
      ],
      "text/plain": [
       "Running query in 'trino://user@localhost:8080/memory'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "result = %sql SELECT * FROM default.taxi WHERE passenger_count > 3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = result.DataFrame()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We need to pass `--no-index` since index creation is not supported in `Trino DB`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Running query in &#x27;trino://user@localhost:8080/memory&#x27;</span>"
      ],
      "text/plain": [
       "Running query in 'trino://user@localhost:8080/memory'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<span style=\"color: green\">Success! Persisted df to the database.</span>"
      ],
      "text/plain": [
       "Success! Persisted df to the database."
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%sql --persist default.df --no-index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Running query in &#x27;trino://user@localhost:8080/memory&#x27;</span>"
      ],
      "text/plain": [
       "Running query in 'trino://user@localhost:8080/memory'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<table>\n",
       "    <thead>\n",
       "        <tr>\n",
       "            <th>vendorid</th>\n",
       "            <th>tpep_pickup_datetime</th>\n",
       "            <th>tpep_dropoff_datetime</th>\n",
       "            <th>passenger_count</th>\n",
       "            <th>trip_distance</th>\n",
       "            <th>ratecodeid</th>\n",
       "            <th>store_and_fwd_flag</th>\n",
       "            <th>pulocationid</th>\n",
       "            <th>dolocationid</th>\n",
       "            <th>payment_type</th>\n",
       "            <th>fare_amount</th>\n",
       "            <th>extra</th>\n",
       "            <th>mta_tax</th>\n",
       "            <th>tip_amount</th>\n",
       "            <th>tolls_amount</th>\n",
       "            <th>improvement_surcharge</th>\n",
       "            <th>total_amount</th>\n",
       "            <th>congestion_surcharge</th>\n",
       "            <th>airport_fee</th>\n",
       "        </tr>\n",
       "    </thead>\n",
       "    <tbody>\n",
       "        <tr>\n",
       "            <td>2</td>\n",
       "            <td>2021-01-01 00:31:06</td>\n",
       "            <td>2021-01-01 00:38:52</td>\n",
       "            <td>5.0</td>\n",
       "            <td>1.7</td>\n",
       "            <td>1.0</td>\n",
       "            <td>N</td>\n",
       "            <td>142</td>\n",
       "            <td>50</td>\n",
       "            <td>1</td>\n",
       "            <td>8.0</td>\n",
       "            <td>0.5</td>\n",
       "            <td>0.5</td>\n",
       "            <td>2.36</td>\n",
       "            <td>0.0</td>\n",
       "            <td>0.3</td>\n",
       "            <td>14.16</td>\n",
       "            <td>2.5</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>2</td>\n",
       "            <td>2021-01-01 00:42:11</td>\n",
       "            <td>2021-01-01 00:44:24</td>\n",
       "            <td>5.0</td>\n",
       "            <td>0.81</td>\n",
       "            <td>1.0</td>\n",
       "            <td>N</td>\n",
       "            <td>50</td>\n",
       "            <td>142</td>\n",
       "            <td>2</td>\n",
       "            <td>4.5</td>\n",
       "            <td>0.5</td>\n",
       "            <td>0.5</td>\n",
       "            <td>0.0</td>\n",
       "            <td>0.0</td>\n",
       "            <td>0.3</td>\n",
       "            <td>8.3</td>\n",
       "            <td>2.5</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>2</td>\n",
       "            <td>2021-01-01 00:31:06</td>\n",
       "            <td>2021-01-01 00:38:52</td>\n",
       "            <td>5.0</td>\n",
       "            <td>1.7</td>\n",
       "            <td>1.0</td>\n",
       "            <td>N</td>\n",
       "            <td>142</td>\n",
       "            <td>50</td>\n",
       "            <td>1</td>\n",
       "            <td>8.0</td>\n",
       "            <td>0.5</td>\n",
       "            <td>0.5</td>\n",
       "            <td>2.36</td>\n",
       "            <td>0.0</td>\n",
       "            <td>0.3</td>\n",
       "            <td>14.16</td>\n",
       "            <td>2.5</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>2</td>\n",
       "            <td>2021-01-01 00:42:11</td>\n",
       "            <td>2021-01-01 00:44:24</td>\n",
       "            <td>5.0</td>\n",
       "            <td>0.81</td>\n",
       "            <td>1.0</td>\n",
       "            <td>N</td>\n",
       "            <td>50</td>\n",
       "            <td>142</td>\n",
       "            <td>2</td>\n",
       "            <td>4.5</td>\n",
       "            <td>0.5</td>\n",
       "            <td>0.5</td>\n",
       "            <td>0.0</td>\n",
       "            <td>0.0</td>\n",
       "            <td>0.3</td>\n",
       "            <td>8.3</td>\n",
       "            <td>2.5</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>2</td>\n",
       "            <td>2021-01-01 00:34:37</td>\n",
       "            <td>2021-01-01 00:47:22</td>\n",
       "            <td>4.0</td>\n",
       "            <td>3.15</td>\n",
       "            <td>1.0</td>\n",
       "            <td>N</td>\n",
       "            <td>238</td>\n",
       "            <td>162</td>\n",
       "            <td>1</td>\n",
       "            <td>12.5</td>\n",
       "            <td>0.5</td>\n",
       "            <td>0.5</td>\n",
       "            <td>2.0</td>\n",
       "            <td>0.0</td>\n",
       "            <td>0.3</td>\n",
       "            <td>18.3</td>\n",
       "            <td>2.5</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "    </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "+----------+----------------------+-----------------------+-----------------+---------------+------------+--------------------+--------------+--------------+--------------+-------------+-------+---------+------------+--------------+-----------------------+--------------+----------------------+-------------+\n",
       "| vendorid | tpep_pickup_datetime | tpep_dropoff_datetime | passenger_count | trip_distance | ratecodeid | store_and_fwd_flag | pulocationid | dolocationid | payment_type | fare_amount | extra | mta_tax | tip_amount | tolls_amount | improvement_surcharge | total_amount | congestion_surcharge | airport_fee |\n",
       "+----------+----------------------+-----------------------+-----------------+---------------+------------+--------------------+--------------+--------------+--------------+-------------+-------+---------+------------+--------------+-----------------------+--------------+----------------------+-------------+\n",
       "|    2     | 2021-01-01 00:31:06  |  2021-01-01 00:38:52  |       5.0       |      1.7      |    1.0     |         N          |     142      |      50      |      1       |     8.0     |  0.5  |   0.5   |    2.36    |     0.0      |          0.3          |    14.16     |         2.5          |     None    |\n",
       "|    2     | 2021-01-01 00:42:11  |  2021-01-01 00:44:24  |       5.0       |      0.81     |    1.0     |         N          |      50      |     142      |      2       |     4.5     |  0.5  |   0.5   |    0.0     |     0.0      |          0.3          |     8.3      |         2.5          |     None    |\n",
       "|    2     | 2021-01-01 00:31:06  |  2021-01-01 00:38:52  |       5.0       |      1.7      |    1.0     |         N          |     142      |      50      |      1       |     8.0     |  0.5  |   0.5   |    2.36    |     0.0      |          0.3          |    14.16     |         2.5          |     None    |\n",
       "|    2     | 2021-01-01 00:42:11  |  2021-01-01 00:44:24  |       5.0       |      0.81     |    1.0     |         N          |      50      |     142      |      2       |     4.5     |  0.5  |   0.5   |    0.0     |     0.0      |          0.3          |     8.3      |         2.5          |     None    |\n",
       "|    2     | 2021-01-01 00:34:37  |  2021-01-01 00:47:22  |       4.0       |      3.15     |    1.0     |         N          |     238      |     162      |      1       |     12.5    |  0.5  |   0.5   |    2.0     |     0.0      |          0.3          |     18.3     |         2.5          |     None    |\n",
       "+----------+----------------------+-----------------------+-----------------+---------------+------------+--------------------+--------------+--------------+--------------+-------------+-------+---------+------------+--------------+-----------------------+--------------+----------------------+-------------+"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%sql SELECT * FROM default.df LIMIT 5"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Clean up\n",
    "\n",
    "To stop and remove the container:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CONTAINER ID   IMAGE           COMMAND                  CREATED         STATUS                   PORTS                    NAMES\n",
      "cba8365556d3   trinodb/trino   \"/usr/lib/trino/bin/…\"   2 minutes ago   Up 2 minutes (healthy)   0.0.0.0:8080->8080/tcp   trino\n"
     ]
    }
   ],
   "source": [
    "! docker container ls"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "%%capture out\n",
    "! docker container ls --filter ancestor=trinodb/trino --quiet"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Container id: cba8365556d3\n"
     ]
    }
   ],
   "source": [
    "container_id = out.stdout.strip()\n",
    "print(f\"Container id: {container_id}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "cba8365556d3\n"
     ]
    }
   ],
   "source": [
    "! docker container stop {container_id}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "cba8365556d3\n"
     ]
    }
   ],
   "source": [
    "! docker container rm {container_id}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES\n"
     ]
    }
   ],
   "source": [
    "! docker container ls"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  },
  "myst": {
   "html_meta": {
    "description lang=en": "Query a PostgreSQL database from Jupyter via JupySQL",
    "keywords": "jupyter, sql, jupysql, postgres",
    "property=og:locale": "en_US"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
